module nazo.appinfo;
/**
 * アプリケーションの情報
 * History:
 *          0.0.0.2 有効なオプションを追加
 *          0.0.0.1 バージョン付け開始
 * Authors: Nazo
 * Version: 0.0.0.2
 * License: Public Domain
 */
import std.string, std.stdio, std.compiler, nazo.date, nazo.token, std.metastrings;
alias std.string.toString toString;

string time2str(int t,int k){
  return zfill(std.string.toString(t),k);
}

///アプリケーションに関する情報(派生して使う)
class AppInfo{
  ///名前
  abstract string name();
  ///バージョン
  abstract string stableVersion();
  ///ホームページ
  abstract string homepage();
  ///ナイトリーバージョンかどうか
  abstract bool isTesting();
  ///ライセンス
  abstract string license();
  ///作成者
  abstract string creator();
  ///貢献者
  abstract string contributor();
  ///有効なオプション
  abstract string enableOptions();
  ///コンパイラの名前とバージョン
  invariant string compiler = std.compiler.name~" v"~ToString!(version_major)~"."~ToString!(version_minor);
  ///Dの仕様のバージョン
  invariant string DLangSpecificationVersion = ToString!(D_major)~"."~ToString!(D_minor);
  ///コンパイルオプション
  string buildFlag;
  ///コンパイルした時の日時
  invariant d_time datetime=getCompileTime();
  string subversion;
  version(X86){
    invariant string cpuArch="X86";
  }else version(X86_64){
    invariant string cpuArch="X86_64";
  }else{
    static assert(0,"not impl");
  }
  version(LittleEndian){
    invariant string cpuEndian="LittleEndian";
  }else version(BigEndian){
    invariant string cpuEndian="BigEndian";
  }else{
    static assert(0,"not impl");
  }
  ///バージョン
  string ver(){
    return stableVersion()~(isTesting()?"+":"")~(subversion?"("~subversion~")":"");
  };
  this(){
    invariant Date d=getTimeStamp();//new Date;
//    datetime=getCompileTime();//parse(d);
//    assert(datetime==getCompileTime());
//    DLangSpecificationVersion=.toString(cast(uint)D_major)~"."~.toString(cast(uint)D_minor);
//    this.compiler=std.compiler.name~" v"~.toString(cast(uint)version_major)~"."~.toString(cast(uint)version_minor);
    //XXX ハック。普通の手段でしたいけど無理?
    debug{
      this.buildFlag="Debug";
    }else{
      this.buildFlag="Release";
      assert((this.buildFlag="")=="");
    }
    if(isTesting()){
      this.subversion=dumpDate(&d);//dumpDate(datetime);
    }
  }
}
